package cn.zhaotianen.codegenerator.tools;


import cn.zhaotianen.codegenerator.config.ClassConfig;
import cn.zhaotianen.codegenerator.config.FileConfig;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.*;

/**
 * <p/>
 * <pre>
 * ***************************************************************
 *  Copyright (c) 2014-2015 –苏州犀牛网络科技有限公司
 *  Package: cn.zhaotianen.codegenerator.tools
 *  Description:
 *  @since 1.0.0
 *  @author 赵天恩
 *  @date 2017/2/21
 *  @time 10:04
 * ***************************************************************
 * </pre>
 */
public class FreemarkerTool {

    /**
     * 生成代码
     *
     * @param fileConfig
     * @param codeConfig
     */
    public static void generateCode(FileConfig fileConfig, ClassConfig codeConfig) throws Exception {
        //初始化FreeMarker配置
        //创建一个Configuration实例
        Configuration configuration = new Configuration();          //模版配置对象
        //设置FreeMarker的模版文件夹位置
        configuration.setDirectoryForTemplateLoading(new File(fileConfig.getTemplatePath()));

        //构造填充数据的Map
        Map root = new HashMap();
        root.put("annotation", codeConfig.getAnnotation());
        root.put("class", codeConfig);
        root.put("fields", codeConfig.getFields());
        root.put("methods", codeConfig.getMethods());
        root.put("responseFields", codeConfig.getResponseFields());
        root.put("serviceName", codeConfig.getServiceName());
        root.put("imports", codeConfig.getImports());
        //创建模版对象
        Template template = configuration.getTemplate(fileConfig.getTemplateName());

        //生成目录文件夹
        File packageFilepath = new File(fileConfig.getCodePath() + File.separator + codeConfig.getPackagePath());
        if (!packageFilepath.exists()) {
            packageFilepath.mkdirs();
        }

        //生成目录文件夹中的文件
        File file = new File(packageFilepath + File.separator + codeConfig.getName() + "." + fileConfig.getFileSuffix());
        if (!file.exists()) {
            file.createNewFile();
        }
        // 显示生成的数据
        Writer writer = new FileWriter(file);
        //在模版上执行插值操作，并输出到制定的输出流中
        template.process(root, writer);
        writer.flush();
        writer.close();
    }
}
